package mx.ipn.negocios;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import mx.ipn.Constantes;
import mx.ipn.to.*;

public class ConexionConPersistencia {
	static RPCServiceClient clienteServicios;

	public static void inicializar() throws AxisFault {
		clienteServicios = new RPCServiceClient();
		Options options = clienteServicios.getOptions();
		// EPR del servicio, se puede encontrar en
		// http://localhost:8080/axis2/services/listServices
		EndpointReference targetEPR = new EndpointReference(
				Constantes.URL_SERVICIOS_PERSISTENCIA);
		options.setTo(targetEPR);
		options.setProperty(org.apache.axis2.addressing.AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES, Boolean.TRUE);
	}

	// Establecer el tipo de fabrica de DAOs
	public static TransferObject iniciarFabricaDAOS(int fabrica) {
		return (TransferObject) invocaServicio("setTipoDeFabrica", fabrica, TransferObject.class);
	}

	// Invocar servicio Robusto
	public static void invocaServicio(String servicio, Object argumentos){
		QName operacion = new QName(Constantes.URI_SERVICIOS, servicio);
		
		Object[] opArgumentos = new Object[] { argumentos };
		
		try{
			clienteServicios.invokeRobust(operacion, opArgumentos);
		}catch(AxisFault e){ e.printStackTrace(); }
		
	}
	
	// Invocar servicio Bloqueando
	public static Object invocaServicio(String servicio, Object argumentos, Class tipoRespuesta){
		QName operacion = new QName(Constantes.URI_SERVICIOS, servicio);
		
		Object[] opArgumentos = new Object[] { argumentos };
		Class[] opTipoRespuesta = new Class[] { tipoRespuesta };
		
		Object[] respuesta = null;
		
		try{
			respuesta = clienteServicios.invokeBlocking(operacion,
				opArgumentos, opTipoRespuesta);
		}catch(AxisFault e){ e.printStackTrace(); }
		
		return respuesta[0];
	}
	
	// Invocar servicio Bloqueando sin argumentos
	public static Object invocaServicio(String servicio, Class tipoRespuesta){
		QName operacion = new QName(Constantes.URI_SERVICIOS, servicio);
		
		Object[] opArgumentos = new Object[] { };
		Class[] opTipoRespuesta = new Class[] { tipoRespuesta };
		
		Object[] respuesta = null;
		
		try{
			respuesta = clienteServicios.invokeBlocking(operacion,
				opArgumentos, opTipoRespuesta);
		}catch(AxisFault e){ e.printStackTrace(); }
		
		return respuesta[0];
	}

}
